package com.alks.common.utils.beanutils;

import cn.hutool.core.util.ArrayUtil;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 数组工具类
 */
public class ArrayUtils extends ArrayUtil {


    /**
     * 将源数组转换成指定类型的列表
     *
     * @param originList  原始列表
     * @param targetClazz 转换后列表元素的类型
     * @param <R>         原始列表元素的类型
     * @param <T>         目标列表元素的类型
     * @return 目标类型的集合
     */
    public static <R, T> List<T> convert(R[] originList, Class<T> targetClazz) {
        return convert(originList, targetClazz, null);

    }

    /**
     * 将源数组转换成指定类型的列表
     *
     * @param originList  原始列表
     * @param targetClazz 转换后列表元素的类型
     * @param convert     转换特殊字段接口
     * @param <R>         原始列表元素的类型
     * @param <T>         目标列表元素的类型
     * @return 目标类型的集合
     */
    public static <R, T> List<T> convert(R[] originList, Class<T> targetClazz, Convert<R, T> convert) {
        if (isEmpty(originList)) {
            return null;
        }

        return Arrays.stream(originList)
                .map(origin -> BeanUtil.copyBean(origin, targetClazz, convert))
                .collect(Collectors.toList());
    }

    /**
     * 判断数组是否为空
     * @param list 需要判断的数组
     * @return true:为空 false:不为空
     */
    public static boolean isEmpyt(Collection<?> list) {
        return list == null || list.isEmpty();
    }

    /**
     * 判断数组是否不为空
     * @param list 需要判断的数组
     * @return true:为空 false:不为空
     */
    public static boolean isNoEmpyt(Collection<?> list) {
        return list != null && !list.isEmpty();
    }

    /**
     * 找到集合中不存在的元素
     * @param original 原始集合
     * @param target 目标集合
     * @return 原始集合存在但目标集合不存在的数据
     * @param <T> 集合元素类型
     */
    public static <T> List<T> findMiss(Collection<T> original, Collection<T> target) {
        if (isEmpyt(original)){
            return new ArrayList<>();
        }if (isEmpyt(target)){
            return new ArrayList<>(original);
        }
        Set<T> missingElementsSet = new HashSet<>(original);
        ArrayList<T> targetList = new ArrayList<>(target);
        targetList.forEach(missingElementsSet::remove);
        return new ArrayList<>(missingElementsSet);
    }

}
